Combine 之中, Publisher 是資料來源, Subscriber 是控制資料流的操作員, Subscriber 可以限制接收的資料信息量, 透過 Demand (需求), 使 Subscriber 得以在連接 Publisher 之後, 得到透過 Pipeline 處理後的資料.
Combine 同時使 Subscriber 可以取消(cancel) Demand 的要求, 在 Combine 里, 所有的 Subscriber 都具備 Cancelable
, 每個 Subscriber 都可以透過 Cancel()
函式, 取消 Publisher 或 pipeline 的 連接.
因此, 我們可以知道 Publisher 是事件產生資料的單元, Pipeline 是轉換資料的單元, Subscriber 是控制 Publisher 週期的單元.
Publisher 與 Subscriber 的生命週期:
Publisher 透過 .subscribe(Subscriber)
, 將指定的 Subscriber 連接在一起.
Publisher 透過 Combine 的架構, 利用 subscriber.receive(subscription)
, 將 Publisher 與 subscriber 綁定在一起.
.request(_:Demand)
來接收 Publisher 的資料..received(_:Input)
的方式將資料給 Subscriber, 但是會將數量限制在 Subscriber 的 demand 之下..cancel()
來結束綁定的生命週期.Publisher 可在錯誤產生時用 receive(completion:)
做處理.
要特別注意的是, Publisher 是 Value type, Subscriber 是 Reference type, 還有一個特別 Subject, 是 Reference type, 目前還不會提到.
此外, 開始學習響應式編程時還有一個很重要的圖像要了解, 就是 彈珠圖 (Marble Diagram), 依照 Rx wiki的說明:
Marble diagrams are frequently in videos and blog entries from the Rx team explaining how certain operators in Rx work.
使用 Marble diagram 可以加快我們學習 Operator 的運作原理. 接下來介紹本篇主題所使用的符號:
// 這是註解
- //單位時間, 沒有特別寫會是 1 秒
X //Error 發生
| //代表 Complete normally
source: //表示事件來源
operat: //代表 operation 表示上流事件的轉換
output: //表示最後結果, 只有在 operation 之後才會出現
// Attach subscribtion then complete without notify
-------------------|
// Attach subscribtion then error occur before any notify
-------------------X
// Attach subscribtion then nothing happen yet
--------------------
1.
source: ------1------2------3---|
map{$0 + 1}
output: ------2------3------4---|
2.
source: ------1------2------3---|
filter{$0.isMultiple(of: 2)}
output: -------------2----------|
3.
source: ------1------2------3---|
map{$0 + 1}
operat: ------2------3------4---|
filter{$0.isMultiple(of: 2)}
output: ------2-------------4---|
簡單測試:
1. 嘗試 google 並解釋 Subject 是什麼?
2. 解釋 .eraseToAnyPublisher()
幫助什麼.
whoami:
我是游諭 ytyubox